﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using GSQ.BusinessEntities;
using GSQ.DataAccess.DataSetTableAdapters;

namespace GSQ.DataAccess
{
    public class AjustesInvetarioDA
    {
        #region Variables
        private AJUSTES_INVTableAdapter AdapterMaster = new AJUSTES_INVTableAdapter();
        private AJUSTES_INV_DETALLESTableAdapter AdapterDetaill = new AJUSTES_INV_DETALLESTableAdapter();

        private V_AJUSTES_INVTableAdapter vAdapterMaster = new V_AJUSTES_INVTableAdapter();
        private V_AJUSTES_INV_DETALLESTableAdapter vAdapterDetaill = new V_AJUSTES_INV_DETALLESTableAdapter();

        private SECUENCIASTableAdapter AdapterSecuencias = new SECUENCIASTableAdapter();
        private PRODUCTOSTableAdapter AdapterProductos = new PRODUCTOSTableAdapter();

        private DataSet.AJUSTES_INVDataTable entitiesMaster;
        private DataSet.AJUSTES_INV_DETALLESDataTable entitiesDetaill;

        private DataSet.AJUSTES_INVRow entityMaster;
        private DataSet.AJUSTES_INV_DETALLESRow entityDetaill;

        private DataSet.SECUENCIASRow entitySecuencia;
        #endregion

        public decimal Insert(AJUSTES_INV value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    AdapterMaster.Connection = cnn;
                    SqlTransaction tr = cnn.BeginTransaction();
                    AdapterMaster.Transaction = tr;

                    AdapterSecuencias.Connection = cnn;
                    AdapterSecuencias.Transaction = tr;

                    entitySecuencia = AdapterSecuencias.GetDataByID(6).FirstOrDefault();

                    entitiesMaster = new DataSet.AJUSTES_INVDataTable();
                    entityMaster = entitiesMaster.NewAJUSTES_INVRow();

                    entityMaster.ID = entitySecuencia.VALUE + 1;
                    entityMaster.ID_USUARIO = value.ID_USUARIO;
                    entityMaster.ID_TIPO = value.ID_TIPO;
                    entityMaster.FECHA = value.FECHA;
                    if (value.OBSERVACIONES != null && value.OBSERVACIONES != string.Empty)
                        entityMaster.OBSERVACIONES = value.OBSERVACIONES;
                    entityMaster.ACTIVO = value.ACTIVO;

                    entitiesMaster.AddAJUSTES_INVRow(entityMaster);
                    try
                    {
                        AdapterMaster.Update(entitiesMaster);

                        AdapterSecuencias.SecuenciasUpdateCommand(6);

                        AdapterDetaill.Connection = cnn;
                        AdapterDetaill.Transaction = tr;

                        AdapterProductos.Connection = cnn;
                        AdapterProductos.Transaction = tr;

                        entitiesDetaill = new DataSet.AJUSTES_INV_DETALLESDataTable();
                        foreach (AJUSTES_INV_DETALLES rw in value.AJUSTES_INV_DETALLES)
                        {
                            entityDetaill = entitiesDetaill.NewAJUSTES_INV_DETALLESRow();

                            entityDetaill.ID = entityMaster.ID;
                            entityDetaill.ID_PRODUCTO = rw.ID_PRODUCTO;
                            entityDetaill.COSTO = rw.COSTO;
                            entityDetaill.PRECIO = rw.PRECIO;
                            entityDetaill.CANTIDAD_AJUSTADA = rw.CANTIDAD_AJUSTADA;
                            entityDetaill.EXISTENCIA_PREVIA = rw.EXISTENCIA_PREVIA;
                            entitiesDetaill.AddAJUSTES_INV_DETALLESRow(entityDetaill);

                            AdapterProductos.ProductosUpdateExistencia(rw.CANTIDAD_AJUSTADA, rw.ID_PRODUCTO);
                        }
                        AdapterDetaill.Update(entitiesDetaill);
                        tr.Commit();
                    }
                    catch (Exception ex)
                    {
                        tr.Rollback();
                        throw ex;
                    }

                    value.ID = entityMaster.ID;
                    return value.ID;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        //public decimal Update(AJUSTES_INV value)
        //{
        //    using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
        //    {
        //        try
        //        {
        //            cnn.Open();
        //            AdapterMaster.Connection = cnn;
        //            SqlTransaction tr = cnn.BeginTransaction();
        //            AdapterMaster.Transaction = tr;

        //            entitiesMaster = AdapterMaster.GetDataByID(value.ID);
        //            entityMaster = entitiesMaster.FirstOrDefault();

        //            entityMaster.ID_USUARIO = value.ID_USUARIO;
        //            entityMaster.ID_TIPO = value.ID_TIPO;
        //            if (value.OBSERVACIONES != null && value.OBSERVACIONES != string.Empty)
        //                entityMaster.OBSERVACIONES = value.OBSERVACIONES;
        //            entityMaster.ACTIVO = value.ACTIVO;



        //            return entity.ID;
        //        }
        //        finally
        //        {
        //            if (cnn.State != System.Data.ConnectionState.Closed)
        //                cnn.Close();
        //        }
        //    }
        //}

        public AJUSTES_INV GetById(decimal id)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;

                    DataSet.V_AJUSTES_INVRow rw = vAdapterMaster.GetDataByID(id).FirstOrDefault();
                    AJUSTES_INV ajustes = null;
                    if (rw != null)
                    {
                        vAdapterDetaill.Connection = cnn;
                        ajustes = GetEntity(rw, vAdapterDetaill.GetDataByID(rw.ID));
                    }
                    return ajustes;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<AJUSTES_INV> GetAll()
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    this.vAdapterDetaill.Connection = cnn;
                    List<AJUSTES_INV> list = new List<AJUSTES_INV>();
                    foreach (DataSet.V_AJUSTES_INVRow rw in vAdapterMaster.GetData())
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<AJUSTES_INV> GetByFechas(DateTime value1, DateTime value2)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    this.vAdapterDetaill.Connection = cnn;
                    List<AJUSTES_INV> list = new List<AJUSTES_INV>();
                    foreach (DataSet.V_AJUSTES_INVRow rw in vAdapterMaster.GetDataByFechas(value1.Date.ToString("MM/dd/yyyy"), value2.Date.ToString("MM/dd/yyyy")))
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        private AJUSTES_INV GetEntity(DataSet.V_AJUSTES_INVRow rwMaster, DataSet.V_AJUSTES_INV_DETALLESDataTable tdDetaill)
        {
            AJUSTES_INV ajusteInv = null;
            if (rwMaster != null)
            {
                ajusteInv = new AJUSTES_INV();
                ajusteInv.ID = rwMaster.ID;
                ajusteInv.ID_USUARIO = rwMaster.ID_USUARIO;
                ajusteInv.USUARIOS = new USUARIOS { ID = rwMaster.ID_USUARIO, NOMBRE_USUARIO = rwMaster.USUARIO };
                ajusteInv.ID_TIPO = rwMaster.ID_TIPO;
                ajusteInv.AJUSTES_INV_TIPOS = new AJUSTES_INV_TIPOS { ID = rwMaster.ID_TIPO, TIPO = rwMaster.TIPO };
                ajusteInv.FECHA = rwMaster.FECHA;
                if (!rwMaster.IsOBSERVACIONESNull())
                    ajusteInv.OBSERVACIONES = rwMaster.OBSERVACIONES;
                ajusteInv.ACTIVO = rwMaster.ACTIVO;

                if (tdDetaill != null)
                {
                    foreach (DataSet.V_AJUSTES_INV_DETALLESRow rw in tdDetaill)
                    {
                        if (rw != null)
                        {
                            AJUSTES_INV_DETALLES ajustedetalle = new AJUSTES_INV_DETALLES();
                            ajustedetalle.ID = rw.ID;
                            ajustedetalle.ID_PRODUCTO = rw.ID_PRODUCTO;
                            ajustedetalle.PRODUCTOS = new PRODUCTOS { ID = rw.ID_PRODUCTO, CODIGO = rw.CODIGO };
                            ajustedetalle.MEDIDAS = new MEDIDAS { ID = rw.ID_MEDIDA, MEDIDA = rw.MEDIDA };
                            ajustedetalle.DESCRIPCIONES = new DESCRIPCIONES { ID = rw.ID_DESCRIPCION, DESCRIPCION = rw.DESCRIPCION };
                            ajustedetalle.COSTO = rw.COSTO;
                            ajustedetalle.PRECIO = rw.PRECIO;
                            ajustedetalle.CANTIDAD_AJUSTADA = rw.CANTIDAD_AJUSTADA;
                            ajustedetalle.EXISTENCIA_PREVIA = rw.EXISTENCIA_PREVIA;
                            ajusteInv.AJUSTES_INV_DETALLES.Add(ajustedetalle);
                        }
                    }
                }
            }
            return ajusteInv;
        }

        public List<AJUSTES_INV_TIPOS> GetAjustesTipos()
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    DataSetTableAdapters.AJUSTES_INV_TIPOSTableAdapter AdapterAjustesTipos = new AJUSTES_INV_TIPOSTableAdapter();
                    AdapterAjustesTipos.Connection = cnn;



                    List<AJUSTES_INV_TIPOS> list = new List<AJUSTES_INV_TIPOS>();
                    foreach (DataSet.AJUSTES_INV_TIPOSRow rw in AdapterAjustesTipos.GetData())
                    {
                        list.Add(new AJUSTES_INV_TIPOS
                        {
                            ID = rw.ID,
                            TIPO = rw.TIPO
                        });
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }
    }
}
